home *** CD-ROM | disk | FTP | other *** search
/ Netware Super Library / Netware Super Library.iso / pgm_tool / lu62 / debug / apl.asm next >
Assembly Source File  |  1995-07-03  |  11KB  |  422 lines

  1. ;**********************************************************
  2. ;*                                                        *
  3. ;*              Root APL module                           *
  4. ;*                                                        *
  5. ;* Function:  It's a monitor of transaction programs.     *
  6. ;*            Depends on value of status field and        *
  7. ;*            rc field will be started "aplmain" or       *
  8. ;*            transaction program.                        *
  9. ;* Input:     None.                                       *
  10. ;* Output:    None.                                       *
  11. ;*                                                        *
  12. ;* Last modification: 93-02-05 16:26.                     *
  13. ;*                                                        *
  14. ;*                                                        *
  15. ;*  CopyRight 1995. Nicholas Poljakov all rights reserved.*
  16. ;*                                                        *
  17. ;**********************************************************
  18. .DOSSEG
  19. .MODEL SMALL
  20.  
  21. include c:\m61\include\dos.inc
  22. include c:\m61\include\bios.inc
  23. include c:\m61\include\macros.inc
  24. include parms.inc
  25. include crtp.inc
  26.  
  27. PUBLIC  err1, str1, AplCall, LnSiz, CurPath, PathLt, ExCom, AplNm
  28. PUBLIC  AplVars, S_AplNm, DosPrmt, InBuff, Apl, NextP, MainCycl, TestDS
  29. PUBLIC  StTrans, EndTrans, RunDS, InCycl, CallSys, CmExit, AplExit, TpE
  30. PUBLIC  AplParm, LuParm, DosCom, ComSeek, CsFound, SetDosCom, SetEnd, SetDC
  31.  
  32. EXTRN    SysCm    :PROC
  33. EXTRN    GetDcWD  :PROC
  34. EXTRN    UpStr    :PROC
  35.  
  36. LU_P_PTR EQU  17    ; offset to field which hold pointer to LuParm
  37. PARM_SZ  EQU  24    ; size of a LU parameters area
  38.  
  39. .STACK   100h
  40.  
  41. .DATA
  42.  
  43. Sign     DD    ?
  44.      ORG   Sign
  45.      DB    'LU62'
  46. AplParm  APL_PARM <>
  47. LuParm   LU_PARM  <>
  48. PARM_SIZ EQU $ - AplParm
  49.  
  50. err1     DB    13,10,"Must have DOS 2.0 or higher",13,10,"$"
  51. err2     DB    'The LU6.2 module was not installed!',13,10,'$'
  52.  
  53. str1     DB    'Type ''Exit'' to return into APL.',10,13,'$'
  54.  
  55. AplCall  DB 80 DUP(0)   ; "<full path name>aplmain 0"
  56. LnSiz    DW    0        ; size of AplCall field
  57. CurPath  DB    13,10
  58.          DB 60 DUP(0)   ; full path name into current directory
  59. PathLt   DW    0        ; length of CurPath field
  60. ExCom    DB    'EXIT'
  61. AplNm    DB    'aplmain.exe '
  62. AplVars  DB    0
  63. S_AplNm  EQU   $ - AplNm
  64.  
  65. DosPrmt  DB 60 DUP(0)   ; Dos prompt field
  66. PspSeg   DW    0        ; segment address of PSP
  67. DosCom   DB    'c:\command.com',0   ; COMSPEC=... line
  68.          DB 60 DUP(0)   ;
  69. ComSp    DB    'COMSPEC='
  70. LT_CS    EQU   $ - ComSp
  71. InBuff   DB    0,0      ; Buffer for input command line
  72.          DB 80 DUP(0)
  73.  
  74. .CODE
  75.  
  76. Apl      PROC
  77.  
  78.          mov   ax, _DATA
  79.          mov   ds, ax
  80.  
  81. ;        cli                         ; Turn off interrupts
  82. ;        mov   ss,ax                 ; Make SS and
  83. ;        mov   sp, OFFSET STACK      ;   SP relative to DGROUP
  84. ;        sti
  85.  
  86.          mov   ax, es
  87.          mov   PspSeg, ax            ; save segment address of PSP
  88.  
  89. ; Adjust memory    allocation
  90.  
  91.          @GetVer                     ; Get DOS version
  92.          cmp    al,3                 ; Requires DOS 3.0
  93.          jge    NextP
  94.          @ShowStr err1               ; else error and quit
  95.          jmp   AplExit
  96.  
  97. NextP:
  98.  
  99.          mov   bx,sp                 ; Convert stack pointer to paragraphs
  100.          mov   cl,4                  ;   to get stack size
  101.          shr   bx,cl
  102.          mov   ax, ss
  103.          add   ax,bx                 ; Add SS to get end of program
  104.          mov   bx,es                 ; Get start of program
  105.          sub   ax,bx                 ; Subtract start from end
  106.          @ModBlock ax                ; Release memory after program
  107.  
  108. ;*
  109. ;* Set parm. area to zero
  110. ;*
  111.          mov   ax, ds
  112.          mov   es, ax
  113.          mov   di, OFFSET AplParm
  114.          xor   al, al
  115.          mov   cx, SIZE AplParm
  116.          cld
  117.          rep   stosb
  118.  
  119. ;*
  120. ;* Set pointers in LU parm area to structures APL_PARM and LU_PARM
  121. ;*
  122.  
  123.          mov   ax, 10h
  124.          mov   bx, 0a0h
  125.          mov   es, ax
  126.          les   bx, DWORD PTR es:[bx] ; pointer to LU parm. table
  127.  
  128. ;* Test if LU 6.2 module is active
  129.  
  130.      mov   ax, WORD PTR es:[bx+PARM_SZ+5]
  131.      cmp   ax, WORD PTR Sign
  132.      jne   ErrExit
  133.  
  134.      mov   ax, WORD PTR es:[bx+PARM_SZ+5+2]
  135.      cmp   ax, WORD PTR Sign+2
  136.      je    @F
  137. ErrExit:
  138.      @ShowStr err2
  139.      @Exit
  140. @@:
  141.      add   bx, LU_P_PTR
  142.          mov   si, OFFSET AplParm
  143.          mov   WORD PTR es:[bx], si
  144.          mov   ax, ds
  145.          mov   WORD PTR es:[bx + 2], ax
  146.  
  147.          add   bx, 4    ; offset to the field wich will hold
  148.                         ; pointer to LuParm structure
  149.          mov   si, OFFSET LuParm
  150.          mov   WORD PTR es:[bx], si
  151.          mov   WORD PTR es:[bx + 2], ax
  152.  
  153. ;*
  154. ;*  Prepare initial AplParm values
  155. ;*
  156.          mov   ax, ds
  157.          mov   es, ax
  158.          mov   si, OFFSET AplNm
  159.          lea   di, AplParm.CmLine
  160.          mov   cx, S_AplNm
  161.          cld
  162.          rep   movsb    ; move "aplmain 0" into the command line
  163.  
  164. ;* Set current_directory_name variable
  165.  
  166.          lea   si, AplParm.Dir
  167.          call  GetDcWD
  168.          mov   AplParm.DirLen, ax
  169.  
  170. ;*  Set AplCall field
  171.  
  172.          mov   cx, ax   ; length of full path name
  173.          lea   si, AplParm.Dir
  174.          mov   di, OFFSET AplCall
  175.          rep   movsb
  176.          mov   al, '\'
  177.          stosb
  178.          mov   si, OFFSET AplNm
  179.          mov   cx, S_AplNm
  180.          rep   movsb
  181.          mov   ax, AplParm.DirLen
  182.          add   ax, S_AplNm
  183.          inc   ax       ; extra char to form ASCIIZ string
  184.          mov   LnSiz, ax
  185.  
  186. ;*  Set address of Program_exit for incoming FMH5
  187.  
  188.          mov   ax, OFFSET TpE
  189.          mov   WORD PTR AplParm.Tpe, ax
  190.          mov   ax, cs
  191.          mov   WORD PTR AplParm.Tpe + 2, ax
  192.  
  193. ;*  Set DosCom field
  194. SetDC:
  195.          mov   ax, PspSeg
  196.          mov   es, ax
  197.          mov   ax, WORD PTR es:[2ch]
  198.          mov   es, ax   ; DOS envirounment field
  199.          xor   di, di
  200.          xor   ax, ax
  201.          mov   cx, 32000
  202.          mov   dx, cx
  203.          cld
  204.          repne scasw    ; seek end of DOS env. field
  205.          sub   dx, cx
  206.          mov   cx, dx   ; length of DOS envirounment
  207.          shl   cx, 1
  208.          xor   di, di
  209. ComSeek:
  210.          mov   al, 'C'
  211.          repne scasb    ; seek first 'C' letter
  212.          and   cx, cx
  213.          jz    MainCycl ; not found...
  214.          mov   dx, di
  215.          dec   di
  216.          mov   si, OFFSET ComSp
  217.          push  cx
  218.          mov   cx, LT_CS
  219.          repe  cmpsb
  220.          pop   cx
  221.          jz    CsFound
  222.          mov   di, dx
  223.          jmp   short ComSeek
  224.  
  225. CsFound:
  226.          push  ds
  227.          mov   ax, es
  228.          mov   ds, ax
  229.          pop   es
  230.  
  231.          mov   si, di
  232.          mov   bx, OFFSET DosCom
  233.  
  234. SetDosCom:
  235.          lodsb
  236.          and   al, al
  237.          jz    SetEnd
  238.          mov   BYTE PTR es:[bx], al
  239.          inc   bx
  240.          jmp   short SetDosCom
  241.  
  242. SetEnd:
  243.          inc   bx
  244.          mov   BYTE PTR es:[bx], 0
  245.          mov   ax, es
  246.          mov   ds, ax   ; restore DS
  247.  
  248. ;*
  249. ;*  Begin main cycle to proceeding of transactions.
  250. ;*
  251.  
  252. MainCycl:
  253.          mov   ax, ds
  254.          mov   es, ax   ; set ES = DS
  255.          lea   si, AplParm.CmLine
  256.          xor   ax, ax
  257.          call  SysCm
  258.  
  259.          mov   ax, AplParm.RetCd  ; completed process defined by this
  260.                                   ; return code
  261.  
  262.          and   ax, ax   ; terminate ?
  263.          jnz   NexTest
  264.          jmp   AplExit
  265. NexTest:
  266.          dec   ax
  267.          and   ax, ax   ; start transaction ?
  268.          jnz   TestDS
  269.          jmp   StTrans
  270. TestDS:
  271.          dec   ax
  272.          and   ax, ax   ; DOS shell ?
  273.          jz    RunDS
  274.          dec   ax
  275.          and   ax, ax   ; remote Command ?
  276.          jz    RemCom
  277.          jmp   AplExit
  278.  
  279. ;*
  280. ;* Start and End Transaction processing
  281. ;*
  282.  
  283. StTrans:
  284.          mov   ax, AplParm.Status
  285.          and   ax, ax   ; is it Start Transaction request ?
  286.          jz    EndTrans ; no... processing of End Transaction
  287.  
  288.          mov   AplParm.Status, 0
  289.          jmp   MainCycl
  290.  
  291. EndTrans:
  292.          lea   di, AplParm.CmLine
  293.          mov   si, OFFSET AplCall
  294.          mov   cx, LnSiz
  295.          cld
  296.          rep   movsb
  297.  
  298.          jmp   MainCycl
  299.  
  300. ;*
  301. ;*  Executing remote command
  302. ;*
  303.  
  304. RemCom:
  305.          lea   si, AplParm.Args
  306.          mov   ax, 1
  307.          call  SysCm
  308.  
  309.          lea   di, AplParm.CmLine
  310.          mov   si, OFFSET AplCall
  311.          mov   cx, LnSiz
  312.          cld
  313.          rep   movsb
  314.  
  315.          jmp   MainCycl
  316.  
  317. ;*
  318. ;*  Accepting and executing commands from keyboard.
  319. ;*  (DOS shell)
  320. ;*
  321. RunDS:
  322.          @ShowStr str1
  323.  
  324. InCycl:
  325.          mov   si, OFFSET CurPath + 2
  326.          call  GetDcWD  ; get current full path name
  327.          mov   PathLt, ax
  328.          add   si, ax   ; pointer to end of CurPath
  329.          mov   BYTE PTR [si], '\'
  330.          mov   BYTE PTR [si + 1], '>'
  331.          mov   BYTE PTR [si + 2], '$'
  332.          @ShowStr CurPath    ; display standart DOS prompt
  333.  
  334.          @GetStr  InBuff, 0, 60
  335.          cmp   InBuff + 1, 4
  336.          je    CmExit   ; test if it's "Exit" command ?
  337. CallSys:
  338.          mov   si, OFFSET InBuff + 1
  339.          mov   ax, 1
  340.          call  SysCm
  341.          jmp   short InCycl
  342.  
  343. CmExit:
  344.          mov   si, OFFSET InBuff + 2
  345.          call  UpStr
  346.          mov   di, OFFSET ExCom
  347.          mov   cx, 4
  348.          cld
  349.          repne cmpsb
  350.          jnz   CallSys
  351.  
  352. ;*
  353. ;*  Processing of "Exit" command
  354. ;*
  355.  
  356.          jmp   MainCycl
  357.  
  358. AplExit:
  359.          @Exit
  360.  
  361. Apl      ENDP
  362.  
  363. ;*
  364. ;*  Incoming FMH5 handler
  365. ;*
  366. TpE      PROC
  367.          @SaveRegs ax,cx,bx,si,di,ds,dx,es,bp
  368.          mov   bp, sp
  369.  
  370.          mov   bx, _DATA
  371.          mov   es, bx   ; restore initial DS value
  372.  
  373.          lds   si, DWORD PTR [bp + 4] ; DS:SI points to CREATE_TP record
  374.          mov   bx, OFFSET LuParm
  375.  
  376.          cld
  377.  
  378. ;*  LuParm.TpId = CRTP.TpID
  379.  
  380.          mov   cx, 8
  381.          lea   di, es:[bx].TpId
  382.          push  si
  383.          lea   si, ds:[si].TpID
  384.          rep   movsb
  385.          pop   si
  386.  
  387. ;*  LuParm.LuId = CRTP.LuID
  388.  
  389.          mov   cx, 8
  390.          lea   di, es:[bx].LuId
  391.          push  si
  392.          lea   si, ds:[si].LuID
  393.          rep   movsb
  394.          pop   si
  395.  
  396. ;* Copy Transaction Program Name
  397.  
  398.          mov   cx, 40
  399.          lea   di, es:[bx].TpNm
  400.          push  si
  401.          lea   si, ds:[si].Tpn
  402.          rep   movsb
  403.          pop   si
  404.  
  405. ;*  Copy ConvID
  406.  
  407.          mov   ax, WORD PTR ds:[si].ConvID
  408.          mov   WORD PTR es:[bx], ax
  409.          mov   ax, WORD PTR ds:[si].ConvID + 2
  410.          mov   WORD PTR es:[bx + 2], ax
  411.  
  412. ;*  AplParm.PgmSt = 1;
  413.  
  414.          mov   bx, OFFSET AplParm
  415.          mov   es:[bx].PgmSt, 1
  416.  
  417.          @RestoreRegs
  418.          iret
  419. TpE      ENDP
  420.  
  421.          END   Apl
  422.